#include <iostream>
#include <vector>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

#define NUM 4

int tickets=1000;//用多线程,模拟一轮抢票

class threadData
{
public:
    threadData(int number)
    {
        threadname="thread"+to_string(number);
    }
    
public:
    string threadname;
};


void* getTicket(void* args)
{
    threadData* td =static_cast<threadData*>(args);
    const char* name=td->threadname.c_str();
    while(true)
    {
        if(tickets>0)
        {
            usleep(1000);
            printf("who=%s,get a ticket: %d\n",name,tickets);
            tickets--;
        }
        else
        {
            break;
        }
    }
    printf("%s ... quit\n",name);
    return nullptr;
}
int main()
{
    vector<pthread_t> tids;
    vector<threadData*> thread_datas;
    for(int i=1;i<NUM;i++)
    {
        pthread_t tid;
        threadData* td =new threadData(i);//---------???
        thread_datas.push_back(td);
        pthread_create(&tid,nullptr,getTicket,thread_datas[i-1]);
        tids.push_back(tid);
    }

    for(auto thread : tids)
    {
        pthread_join(thread,nullptr);
    }
    for(auto td:thread_datas)
    {
        delete td;
    }
    return 0;
}






// #define NUM 3

// __thread int g_val = 100;

// int* p=nullptr;
// struct threadData
// {
//     string threadname;
// };
// string toHex(pthread_t tid)
// {
//     char buffer[128];
//     snprintf(buffer,sizeof(buffer),"0x%x",tid);//----%x打印
//     return buffer;
// }
// void InitThreadData(threadData* td,int number)
// {
//     td->threadname="thread-"+to_string(number);//---转字符

// }

// void* threadrun(void* args)
// {
//     int test_i=0;
//     threadData* td=static_cast<threadData*>(args);//---args要加括号
//     if(td->threadname=="thread-2")
//     {
//         p =&test_i;
//     }
//     int i=0;
//     while(i<10)
//     {
//         cout<<"pid:"<<getpid()<<
//         ",tid:"<<toHex(pthread_self())<<
//         ",threadname:"<<td->threadname<<
//         ",test_i:"<<test_i<<
//         ",&test_i:"<<&test_i<<endl;
//         sleep(1);
//         i++;
//         test_i++;
//     }
//     delete td;
//     return nullptr;
// }
// int main()
// {
//     vector<pthread_t> v;
//     threadData td;

//     for(int i=0;i<NUM;i++)
//     {
//         pthread_t tid;
//         threadData *td=new threadData;//为什么要这么创建?//申请在堆空间上
//         InitThreadData(td,i);//数据初始化
//         pthread_create(&tid,nullptr,threadrun,(void*)td);
//         v.push_back(tid);
//         //sleep(1);
//     }
//     sleep(1);
//     for(auto i:v)
//     {
//         pthread_detach(i);
//     }
//     // cout<<"main thread get a thread loacl valu , val: "<<*p<<", &val:"<<p<<endl;

//     for(int i=0;i<NUM;i++)
//     {
//         int n = pthread_join(v[i],nullptr);
//         printf("n = %d , who = %x\n",n,v[i]);
//     }
//     return 0;
// }